from django.test import TestCase

# Create your tests here.
from rest_framework.test import APITestCase
from accounts.models import User
from .serializer import *
from rest_framework.authtoken.models import Token

class AccountsAPITest(APITestCase):
    base_url = '/accounts/user'

    # 2. 有获取验证码接口
    def test_get_code(self):

    # POST / get_code /
    # 1接口返回200
        url = self.base_url + '/get_code/'
        data={
            'mobile':'138777999'
        }

        _code = []  # 保存验证码

        for i in range(5):
            response=self.client.post(url,data)
            self.assertEqual(response.status_code,200)
            code=response.data['code']

            _code.append(code)
        self.assertEquals(len(set(_code)),5)




    def test_reg(self):
        url=self.base_url + '/reg/'
    # 3.注册的接口POST / reg /
    # 1.应该输入全部字段
        data={
            'username':'zy',
            'mobile':'138777999',
            'password':'123456',
            'code':'',
        }

        code_response=self.client.post(self.base_url+'/get_code/',data)
        code=code_response.data['code']
        data['code']=code
        response=self.client.post(url,data)
        # 2.输入的数据正确，接口返回200。同时返回用户的数据（可选）
        self.assertEqual(response.status_code,200)
    # 3.数据库中添加新的用户，除了密码字段，其他字段和用户输入的一样
        user=User.objects.first()
        #有用户被创造
        self.assertTrue(user)
        self.assertEqual(user.username,data['username'])
        self.assertEqual(user.mobile,data['mobile'])
        # 4.数据库中密码，和用户输入的密码不一样
        self.assertNotEqual(user.password,data['password'])
        # 5.使用 ** django功能 **，密码可以通过验证
        self.assertTrue(user.check_password(data['password']))


        # 6.如果用户名重复、手机号重复、验证码错误，接口400，返回错误提示
        response = self.client.post(url, data)
        self.assertEqual(response.status_code,400)

        #用户名有错误
        self.assertTrue(response.data.get('username'),False)
        #手机号错误
        self.assertTrue(response.data.get('mobile'), False)
        #验证码错误
        self.assertTrue(response.data.get('code'), False)

    def test_login(self):
        url = self.base_url+'/login/'
        data = {
            'username': 'zy',
            'password': '123456',
            'mobile': '138777555',
        }
        # mock 数据
        user = User.objects.create_user(**data)
        # 登录接口 post，/login/
        # 用户输入的密码是明文
        response = self.client.post(url,data)
        # 用户登录失败，错误提示,用户名和密码不匹配，返回400
        response = self.client.post(url, {**data,**{'password':data['password']+'0'}}) #错误密码
        self.assertContains(response, '用户名和密码不匹配',status_code=400)
        response = self.client.post(url, data)
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, data['username'])
        # 获取用户的token
        token = Token.objects.get(user=user)  # 此处的token是实例，不是身份凭证
        token.key
        self.assertContains(response, token.key)





